package intermouse;

import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * A hangyákat támadó objektumok ősosztálya, ebből származik le minden további
 * támadó entitás.
 * 
 * @author Bendefy Zoltán
 * @version 1.0
 * @since 2013-03-23
 */
public class Malicious extends FieldObject {
	/**
	 * Azt határozza meg, hogy az adott objektum újra letehető-e a pályára. Ha
	 * nem, olyankor a Spawn metódus tipikusan csak egyszer, létrehozáskor
	 * hívódik meg.
	 */
	protected boolean respawnable;

	/**
	 * Konstruktor
	 * 
	 * A Malicious osztály konstruktora.
	 */
	Malicious() {
		respawnable = false;
	}

	/**
	 * Egy belülről hívott függvény, amellyel az objektum támadni tud.
	 * 
	 * Ez a függvény felelős azért, hogy a malicious entitás támadását
	 * levezényelje. A függvény meghívja az objektum field-ének az attack()
	 * metódusát, majd visszaadja az attól kapott eredményt.
	 * 
	 * @return Egy boolean-al tér vissza, melyben true jelenti a sikeres
	 *         támadást, míg false jelenti a sikertelen támadást.
	 */
	protected boolean beginAttack() {
		System.out.println(">> Malicious.beginAttack() : boolean");
		
		boolean ret = field.attack();
		
		if (ret)
			TestCommandParser.log("Malicious object of "+this.getClass().toString()+" type kills an Ant at " + field.toString() +".");
			
		System.out.println("<< return");
		return ret;
	}

	/**
	 * Ebben a kívülről hívott metódusban futnak le a malicious objektum körben
	 * végzett tevékenységei.
	 * 
	 * Ez a függvény felelős azért, hogy a malicious objektum minden, az adott
	 * körben elvégzendő tevékenységet végrehajtson. Ebben zajlik le a támadás,
	 * valamint az egyes támadó egységek logikája.
	 * 
	 * @return A függvény void-dal tér vissza, miután minden cselekvést
	 *         elvégzett.
	 */
	public void beginRound() {
		System.out.println(">> Malicious.beginRound() : void");
		
		if (getField() == null) 
		{
			System.out.println("Figyelem! Az objektum field-je null!");
			return;
		}
		
		beginAttack();
		
		System.out.println("<< return");
	}

	/**
	 * Ebben a kívülről hívott metódusban tudja a hangya lekérdezni, hogy
	 * léphet-e ide.
	 * 
	 * Ez a metódus a FieldObject-ből származik, és azért felelős, hogy
	 * hangyának megmondja, hogy ráléphet-e a mezőre, amelyen ez az objektum
	 * van.
	 * 
	 * @param ant
	 *            A metódus megjapja a hangyát, aki az objektum mezőjére akar
	 *            lépni, és üzenhet neki a függvényein keresztül
	 * @return A függvény egy boolean-al tér vissza, ami megmondja, hogy a
	 *         hangya ráléphet-e az adott mezőre.
	 */
	public boolean canStep(Ant ant) {
		System.out.println(">> Malicious.canStep(Ant) : boolean");
		System.out.println("<< return");
		return false;
	}
	
	/**
	 * Ebben a kívülről hívott metódusban tudja a kő lekérdezni, hogy
	 * léphet-e ide.
	 * 
	 * Ez a metódus a FieldObject-ből származik, és azért felelős, hogy
	 * kőnek megmondja, hogy ráléphet-e a mezőre, amelyen ez az objektum
	 * van.
	 * 
	 * @param ant
	 *            A metódus megjapja a követ, aki az objektum mezőjére akar
	 *            lépni, és üzenhet neki a függvényein keresztül
	 * @return A függvény egy boolean-al tér vissza, ami megmondja, hogy a
	 *         kő ráléphet-e az adott mezőre.
	 */
	public boolean canStep(Stone stone, boolean isFirst, int direction) {
		System.out.println(">> Malicious.canStep(Stone) : boolean");
		System.out.println("<< return");
		return false;
	}

	/**
	 * Ezzel a metódussal lehet felhelyezni a malicious objektumot a játéktérre
	 * 
	 * Ez a metódus helyezi fel az objektumot a pályára. Beállítja a field
	 * változó értékét a paraméterben megadottra, majd egyéb inicializálásokat
	 * végez.
	 * 
	 * @param field
	 *            A mező amelyre az objektumot helyezni fogjuk
	 * @return A függvény egy void-dal tér vissza
	 */
	public void spawn(Field field) {
		System.out.println(">> Malicious.spawn(Field) : void");
		
		if (!respawnable && getField() != null) return;
		
		setField(field);
		
		TestCommandParser.log("Spawned Malicious at "+field.toString()+".");
		
		System.out.println("<< return");
	}
}